class Solution {
public:
    int longestSquareStreak(vector<int>& ans) {
        // 1. 先排序，反正也是要排序一下的
        sort(ans.begin(), ans.end());

        // 2. 把每一个数值都存储起来(借助unordered_map哈希表来判断一个值是否在一个数组序列中)
        unordered_map<long long, int> hash;
        for(size_t i = 0; i < ans.size(); i++) hash[ans[i]] = 1;

        // 3. 再以ans数组的每一个值为第一个值，向后遍历看hash中有没有
        //    因为最短的长度要求是2个数 
        // --> 所以注意遍历的区间, 不过也是没有问题的。因为前面排序过了，越来越大的数是根部可能出现的。
        long long maxlen = 0;
        for(size_t i = 0; i < ans.size() - 1; i++){
            long long len = 1;
            // x下面的这一行是不行的哦，应该还是关于是会溢出的问题吧
            // long long value = ans[i] * ans[i];

            // 还是得用下面的两行的哦
            long long value = ans[i];
            value *= value;
            while(hash[value] == 1){
                len++;
                value *= value;   // 迭代去找
            }
            maxlen = max(maxlen, len);
        }

        if(maxlen > 1) return maxlen;

        return -1;
    }
};

